import vnode from "./vnode";

// 必须接收三个参数 必须是三种之一
// 形态一 h("div",{},"文字");
// 形态二 h("div",{},[]);
// 形态三 h("div",{},h());
export default function (sel, data, c) {
    // 检查参数个数
    if (arguments.length != 3) {
        throw new Error("must three elements");
    }
    // 检查参数c的类型
    // 如果c是基本类型值
    if (typeof c == "string" || typeof c == "number") {
        // 说明是形态一
        return vnode(sel, data, undefined, c, undefined);
    } else if (Array.isArray(c)) {
        let children = [];
        // 说明是形态二
        // 遍历c,收集children
        for (let i = 0; i < c.length; i++) {
            if (!(typeof c[i] == "object" && c[i].hasOwnProperty("sel"))) {
                throw new Error("数组中有项类型不对");
            }
            // 此时只需要将子项放入children中
            children.push(c[i]);
        }
        // 循环结束，children已收集完毕
        return vnode(sel, data, children, undefined, undefined)
    } else if (typeof c == "object" && c.hasOwnProperty("sel")) {
        // 说明是形态三
        // 传入的C是唯一的children
        let children = [c];
        return vnode(sel, data, children, undefined, undefined)
    } else {
        throw new Error("传入类型不正确");
    }
}